using System;
using EYDIngenieria.ERP.Aplicacion.Mantenedores;
using EYDIngenieria.ERP.ObjetosDeNegocio.Repositorio;
using EYDIngenieria.ERP.ObjetosDeNegocio.Dominio;

namespace EYDIngenieria.ERP.Aplicacion.Gestion
{
    public class GestionInventario
    {
// ReSharper disable InconsistentNaming
        private readonly RepositorioInventario repositorioInventario = new RepositorioInventario();
// ReSharper restore InconsistentNaming
// ReSharper disable InconsistentNaming
        private readonly MantenedorProducto mantenedorProducto  = new MantenedorProducto();
// ReSharper restore InconsistentNaming
        private readonly RepositorioDetalleDespachoMaterialesOT repositorioDespachoMaterialesOT = new RepositorioDetalleDespachoMaterialesOT();
        private readonly RepositorioDetalleDespachoMaterialesOTAuxiliar repositorioDespachoMaterialesOTAuxiliar = new RepositorioDetalleDespachoMaterialesOTAuxiliar();

       


        public void Agregar(Producto p,double cantidad,double valorUnitario,Factura f)
        {
            Inventario inventario = new Inventario();
            inventario.Factura = f;
            inventario.Producto = p;
            inventario.CantidadIngreso = cantidad;
            inventario.Saldo = cantidad;
            inventario.ValorUnitario = valorUnitario;
            inventario.MontoIngreso = cantidad*valorUnitario;
            inventario.Producto.Stock = inventario.Producto.Stock + inventario.CantidadIngreso;
            mantenedorProducto.Modificar(inventario.Producto);
            inventario.Fecha = DateTime.Now;
            repositorioInventario.Agregar(inventario);
        }

        public Inventario[] Listar()
        {
            return repositorioInventario.Listar();
        }

        public Inventario[] ListarInventarioDeFamilia(FamiliaProducto f)
        {
            return repositorioInventario.ListarInventarioDeFamilia(f);
        }

        public Inventario[] Obtener(Producto p)
        {
            return repositorioInventario.Buscar(p);
        }



        public double Quitar(DetalleOrdenDeTrabajo dot, double cantidad, double valorUnitario)
        {
            Producto p = dot.Producto;
            Inventario[] inventarioExistente = repositorioInventario.Buscar(p);
            p.Stock -= cantidad;
            mantenedorProducto.Modificar(p);
            double saldoCantidad = cantidad;
            double monto = 0;
            foreach(Inventario i  in inventarioExistente)
            {
                if (saldoCantidad >= i.Saldo)
                {
                    monto = (i.Saldo * i.ValorUnitario);
                    i.CantidadEgreso = i.CantidadEgreso + i.Saldo;
                    saldoCantidad = saldoCantidad - i.Saldo;
                    i.MontoEgreso = i.MontoEgreso + monto;
                    i.Saldo = 0;
                }
                else
                {
                    i.Saldo = i.Saldo - saldoCantidad;
                    monto = (saldoCantidad*i.ValorUnitario);
                    i.MontoEgreso = i.MontoEgreso + monto;
                    i.CantidadEgreso = i.CantidadEgreso + saldoCantidad;
                    saldoCantidad = 0;
                }
                i.Fecha = DateTime.Now;
                repositorioInventario.Modificar(i);

                DetalleDespachoMaterialesOT detalleDespacho = new DetalleDespachoMaterialesOT();
                detalleDespacho.Cantidad = cantidad;
                detalleDespacho.Inventario = i;
                detalleDespacho.DetalleOT = dot;
                repositorioDespachoMaterialesOT.Agregar(detalleDespacho);
                if (cantidad == 0)
                    return 0;
            }
            return monto;
        }

        public double Quitar(DetalleOrdenDeTrabajoAuxiliar dot, double cantidad, double valorUnitario)
        {
            Producto p = dot.Producto;
            Inventario[] inventarioExistente = repositorioInventario.Buscar(p);
            p.Stock -= cantidad;
            mantenedorProducto.Modificar(p);
            double saldoCantidad = cantidad;
            double monto = 0;
            foreach (Inventario i in inventarioExistente)
            {
                if (saldoCantidad >= i.Saldo)
                {
                    monto = (i.Saldo * i.ValorUnitario);
                    i.CantidadEgreso = i.CantidadEgreso + i.Saldo;
                    saldoCantidad = saldoCantidad - i.Saldo;
                    i.MontoEgreso = i.MontoEgreso + monto;
                    i.Saldo = 0;
                }
                else
                {
                    i.Saldo = i.Saldo - saldoCantidad;
                    monto = (saldoCantidad * i.ValorUnitario);
                    i.MontoEgreso = i.MontoEgreso + monto;
                    i.CantidadEgreso = i.CantidadEgreso + saldoCantidad;
                    saldoCantidad = 0;
                }
                i.Fecha = DateTime.Now;
                repositorioInventario.Modificar(i);

                DetalleDespachoMaterialesOTAuxiliar detalleDespacho = new DetalleDespachoMaterialesOTAuxiliar();
                detalleDespacho.Cantidad = cantidad;
                detalleDespacho.Inventario = i;
                detalleDespacho.DetalleOT = dot;
                repositorioDespachoMaterialesOTAuxiliar.Agregar(detalleDespacho);
                if (cantidad == 0)
                    return 0;
            }
            return monto;
        }
       
    }
}
